package cn.lingyangwl.agile.gateway.filter;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.web.reactive.function.server.HandlerStrategies;

import java.util.List;

/**
 * 密码解密工具类
 * @author shenguangyang
 */
@Slf4j
@RequiredArgsConstructor
public class PasswordDecoderFilter extends AbstractGatewayFilterFactory {

	private static final List<HttpMessageReader<?>> messageReaders = HandlerStrategies.withDefaults().messageReaders();

	private static final String PASSWORD = "password";

	private static final String KEY_ALGORITHM = "AES";

	private final GatewayProperties properties;

	@Override
	public GatewayFilter apply(Object config) {
		return (exchange, chain) -> {
//			ServerHttpRequest request = exchange.getRequest();
//			// 1. 不是登录请求，直接向下执行
//			if (!StrUtil.containsAnyIgnoreCase(request.getURI().getPath(), SecurityConstants.OAUTH_TOKEN_URL)) {
//				return chain.filter(exchange);
//			}
//
//			// 2. 刷新token类型，直接向下执行
//			String grantType = request.getQueryParams().getFirst("grant_type");
//			if (StrUtil.equals(SecurityConstants.REFRESH_TOKEN, grantType)) {
//				return chain.filter(exchange);
//			}
//
//			// 3. 前端加密密文解密逻辑
//			Class inClass = String.class;
//			Class outClass = String.class;
//			ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders);
//
//			// 4. 解密生成新的报文
//			Mono<?> modifiedBody = serverRequest.bodyToMono(inClass).flatMap(decryptAES());
//
//			BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, outClass);
//			HttpHeaders headers = new HttpHeaders();
//			headers.putAll(exchange.getRequest().getHeaders());
//			headers.remove(HttpHeaders.CONTENT_LENGTH);
//
//			headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
//			CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers);
//			return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() -> {
//				ServerHttpRequest decorator = decorate(exchange, headers, outputMessage);
//				return chain.filter(exchange.mutate().request(decorator).build());
//			}));
			return chain.filter(exchange);
		};
	}

//	/**
//	 * 原文解密
//	 * @return
//	 */
//	private Function decryptAES() {
//		return s -> {
//			// 构建前端对应解密AES 因子
//			AES aes = new AES(Mode.CFB, Padding.NoPadding,
//					new SecretKeySpec(gatewayConfig.getEncodeKey().getBytes(), KEY_ALGORITHM),
//					new IvParameterSpec(gatewayConfig.getEncodeKey().getBytes()));
//
//			// 获取请求密码并解密
//			Map<String, String> inParamsMap = HttpUtil.decodeParamMap((String) s, CharsetUtil.CHARSET_UTF_8);
//			if (inParamsMap.containsKey(PASSWORD)) {
//				String password = aes.decryptStr(inParamsMap.get(PASSWORD));
//				// 返回修改后报文字符
//				inParamsMap.put(PASSWORD, password);
//			}
//			else {
//				log.error("非法请求数据:{}", s);
//			}
//			return Mono.just(HttpUtil.toParams(inParamsMap, Charset.defaultCharset(), true));
//		};
//	}
//
//	/**
//	 * 报文转换
//	 * @return
//	 */
//	private ServerHttpRequestDecorator decorate(ServerWebExchange exchange, HttpHeaders headers,
//			CachedBodyOutputMessage outputMessage) {
//		return new ServerHttpRequestDecorator(exchange.getRequest()) {
//			@Override
//			public HttpHeaders getHeaders() {
//				long contentLength = headers.getContentLength();
//				HttpHeaders httpHeaders = new HttpHeaders();
//				httpHeaders.putAll(super.getHeaders());
//				if (contentLength > 0) {
//					httpHeaders.setContentLength(contentLength);
//				}
//				else {
//					httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
//				}
//				return httpHeaders;
//			}
//
//			@Override
//			public Flux<DataBuffer> getBody() {
//				return outputMessage.getBody();
//			}
//		};
//	}

}
